//package com.ctrip.corp.obt.shard.sql.parser;
//
//import com.ctrip.corp.obt.generic.utils.CollectionUtils;
//import com.ctrip.corp.obt.shard.utils.PluginUtils;
//import com.ctrip.corp.obt.shard.utils.SqlParserHelper;
//import lombok.Data;
//import lombok.experimental.Accessors;
//import org.apache.ibatis.executor.statement.CallableStatementHandler;
//import org.apache.ibatis.executor.statement.StatementHandler;
//import org.apache.ibatis.reflection.MetaObject;
//import org.apache.ibatis.reflection.SystemMetaObject;
//
//import java.util.List;
//
///**
// * SQL 解析处理器
// *
// * @author marco.zheng
// * @since 2021-08-31
// */
//@Data
//@Accessors(chain = true)
//public abstract class AbstractSqlParserHandler {
//
//    private List<ISqlParser> sqlParserList;
//
//    /**
//     * 拦截 SQL 解析执行
//     */
//    protected void sqlParser(MetaObject metaObject) {
//        if (null != metaObject) {
//            Object originalObject = metaObject.getOriginalObject();
//            StatementHandler statementHandler = PluginUtils.realTarget(originalObject);
//            metaObject = SystemMetaObject.forObject(statementHandler);
//
//            // @SqlParser(filter = true) 跳过该方法解析
//            if (SqlParserHelper.getSqlParserInfo(metaObject)) {
//                return;
//            }
//
//            // 执行SQL解析
//            if (CollectionUtils.isNotEmpty(this.sqlParserList)) {
//                statementHandler = metaObject.hasGetter("delegate") ? (StatementHandler) metaObject.getValue("delegate") : statementHandler;
//                if (!(statementHandler instanceof CallableStatementHandler)) {
//                    // 标记是否修改过 SQL
//                    boolean sqlChangedFlag = false;
//                    String originalSql = (String) metaObject.getValue(PluginUtils.DELEGATE_BOUNDSQL_SQL);
//                    for (ISqlParser sqlParser : this.sqlParserList) {
//                        if (sqlParser.doFilter(metaObject, originalSql)) {
//                            SqlInfo sqlInfo = sqlParser.parser(metaObject, originalSql);
//                            if (null != sqlInfo) {
//                                originalSql = sqlInfo.getSql();
//                                sqlChangedFlag = true;
//                            }
//                        }
//                    }
//                    if (sqlChangedFlag) {
//                        metaObject.setValue(PluginUtils.DELEGATE_BOUNDSQL_SQL, originalSql);
//                    }
//                }
//            }
//        }
//    }
//}
